const regex = {
  // 手机号
  tel: /^1[3-9]\d{9}$/,
  // 邮箱
  email: /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
  // 密码：密码为8-16位，包含数字和字母
  password: /^(?=.*\d)(?=.*[a-zA-Z])[a-zA-Z0-9]{8,16}$/,
  // 身份证号身份证号(15位、18位数字)，最后一位是校验位，可能为数字或字符X
  // idcard: /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/,
  idcard: /(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}$)/,
  // 姓名 不能包含特殊字符
  name: /([`~!@#$%^&*()_\-+=<>?:"{},.\\/;'[\]])|([·！#￥（——）：；“”‘、，|《。》？、【】[\]])/im,
  // 非身份证、户口本的证证件号规则
  idNum: /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,}$/
}

export default regex

// 获取长度
function getStringLength (value) {
  const sTmpStr = new String(value)
  let sTmpChar
  const nOriginLen = sTmpStr.length
  let nStrLength = 0
  for (let i = 0; i < nOriginLen; i++) {
    sTmpChar = sTmpStr.charAt(i)
    if (escape(sTmpChar).length > 4) {
      nStrLength += 2
    } else if (sTmpChar != '\r') {
      nStrLength++
    }
  }
  return nStrLength
}

// 非空校验
function hasValue (value) {
  if (value != null && value != 'null' && value != '' && value != 'undefined' && undefined != value) {
    return true
  }
  return false
}

// 姓名规则
function nameRule (value, aim) {
  // 1.不能包含特殊字符
  const str = "`~!@#$%^&*()-_=+[]{}\\|:;\"\'<,>?/！@#￥%&*（）——+【】{}、《》|？"
  for (let i = 0; i <= str.length - 1; i++) {
    const c = str.charAt(i)
    if (value.indexOf(c) > -1) {
      return '您输入的' + aim + '姓名格式不正确，请重新输入'
    }
  }
  // 2.字符串长度再[4,40] （转换成英文算）
  if (getStringLength(value) < 4 || getStringLength(value) > 40) {
    return '您输入的' + aim + '姓名格式不正确，请重新输入'
  }
  // 3.姓名中可以有点，点必须在中间，不能有其他字符
  // 4.纯英文的可以有空格和点
  if (!(/^[a-zA-Z][a-zA-Z\.。\s]*[a-zA-Z]$/.test(value)) && !(/^[\u4E00-\u9FA5][\u4E00-\u9FA5\.。\s]*[\u4E00-\u9FA5]$/.test(value))) {
    return '您输入的' + aim + '姓名格式不正确，请重新输入'
  }
  // 生僻字
  /* if(/(^[\u2E80-\uFE4F]{2,32}$)|(^[a-zA-Z]{2,32}$)/.test(value)){
          checkResult = "您输入的投保人姓名中有特殊汉字，请联系956097协调解决";
          return checkResult;
      } */
  return ''
}

// 校验身份证最后一位
function checkIDNoLastCode (IDNo) {
  const a = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1]
  const b = '10X98765432'
  let sum = 0
  for (let i = 0; i < 17; i++) {
    sum += a[i] * IDNo.substring(i, i + 1) // 加权求和
  }
  const x = sum % 11 // 得到验证码所位置
  if (IDNo.substring(17, 18) == b.substring(x, x + 1)) {
    return true
  } else {
    return false
  }
}

// 获取字符串的字节数（中文按2个字节算）
function chineseLength (value) {
  let len = 0
  const aa = '[\\u0391-\\uFFE5]'
  /* 获取字段值的长度，如果含中文字符，则每个中文字符长度为2，否则为1 */
  for (let i = 0; i < value.length; i++) {
    /* 获取一个字符 */
    const temp = value.substring(i, i + 1)
    /* 判断是否为中文字符 */
    if (temp.match(aa)) {
      /* 中文字符长度为2 */
      len += 1
    }
  }
  return len
}

// function addressRepeat(appAddressDetail) {
//     var str = ["北京市", "天津市", "河北省", "山西省", "内蒙古自治区", "辽宁省", "吉林省", "黑龙江省", "上海市", "江苏省", "浙江省", "安徽省", "福建省", "江西省", "山东省", "河南省", "湖北省", "湖南省", "广东省", "广西壮族自治区",
//         "海南省", "重庆市", "四川省", "贵州省", "云南省", "西藏自治区", "陕西省", "甘肃省", "青海省", "宁夏回族自治区", "新疆维吾尔自治区", "台湾省", "香港特别行政区", "澳门特别行政区"
//     ];
//     var flage = true;
//     for (var i = 0; i < str.length; i++) {
//         if (appAddressDetail.indexOf(str[i]) == 0 && appAddressDetail.indexOf(str[i], 1) > 0) {
//             flage = false;
//             break;
//         } else if (appAddressDetail.indexOf(str[i]) > 0) {
//             flage = false;
//             break;
//         }
//     }
//     return flage;
// }

/**
 * 校验 姓名规则
 * @param name {string} 用户姓名
 * @param [aim] {string}  投保人 被保人
 * @returns {string} 返回值为 “” 表示校验通过，否则返回失败信息
 */
export const nameChecker = function (name, aim = '') {
  if (!hasValue(name)) {
    return '请输入' + aim + '姓名'
  }
  const checkResult = nameRule(name, aim)
  if (checkResult.length > 0) {
    return checkResult
  }
  return ''
}
/**
 * 校验 姓名规则
 * @param nickName {string} 用户姓名
 * @returns {string} 返回值为 “” 表示校验通过，否则返回失败信息
 */
export const nickNameChecker = function (nickName) {
  if (!hasValue(nickName)) {
    return '请输入昵称'
  }
  // 2.字符串长度再[4,40] （转换成英文算）
  if (getStringLength(nickName) < 4 || getStringLength(nickName) > 20) {
    return '您输入的昵称格式不正确，请重新输入'
  }
  return ''
}

/**
 * 校验身份证规则
 * @param IDNo
 * @returns {string}
 */
export const idNoChecker = function (IDNo) {
  if (IDNo.length === 0) {
    return '请输入身份证号'
  }
  // 正则判断
  if (!regex.idcard.test(IDNo)) {
    return '请输入正确的身份证号'
  }
  // 校验位数和最后一位
  if (IDNo.length === 18 && !checkIDNoLastCode(IDNo)) {
    return '请输入正确的身份证号'
  }
  return ''
}

/**
 *银行卡校验
 * @param bankNo  银行卡号
 * @returns {string} 空字符串为正确 否则返回字符串为具体错误信息
 */
export const bankNoChecker = function (bankNo) {
  if (bankNo.length === 0) {
    return '请输入银行卡号'
  }
  if (!luHn(bankNo)) {
    return '请输入正确银行卡'
  }
  return ''
}

/**
 * 校验邮箱
 * @param email
 * @returns {string} 空字符为正确
 */
export const emailChecker = function (email) {
  if (email.length === 0) {
    return '请输入投保人电子邮箱地址'
  } else if (!regex.email.test(email)) {
    return '投保人电子邮箱地址格式错误，请重新输入'
  }
  return ''
}

/**
 * 校验手机号
 * @param phone
 * @param aim {string} 投保人/被保险人
 * @returns {string} 空字符为正确
 */
export const phoneChecker = function (phone, aim = '') {
  if (phone.length === 0) {
    return `请输入${aim}手机号码`
  } else if (!regex.tel.test(phone)) {
    return `${aim}手机号输入有误，请重新输入`
  }
  return ''
}

/**
 * 判断是否为外链
 * @param {string} path
 * @returns {Boolean}
 */
export function isExternal (path) {
  return /^(https?:|mailto:|tel:)/.test(path)
}

export function verCodeChecker (verCode) {
  if (verCode.length === 0) {
    return '请输入验证码'
  } else if (!/^[0-9]{6}$/.test(verCode)) {
    return '请输入正确的验证码'
  }
  return ''
}
